import request from "@/utils/request";

/**
 * 处理认证相关的 JSON-RPC 响应
 * @param {Object} response Axios 响应对象
 * @returns {Object} 成功响应的 result 部分
 * @throws {Error} 如果响应包含错误
 */
function handleAuthResponse(response) {
  if (response?.data?.error) {
    console.error("Auth API Error:", response.data.error);
    throw new Error(response.data.error.message || '认证 API 请求失败');
  }
  if (response?.data?.result) {
    return response.data.result; // 返回成功响应的 result 部分
  }
  // 未知错误或非预期格式
  console.error("Unexpected Auth API response format:", response?.data);
  throw new Error('认证 API 响应格式错误或非预期结果');
}

/**
 * 处理 JSON-RPC 响应，简化版，用于 logout unload
 * @param {Object} response Axios 响应对象
 * @returns {boolean} 是否请求成功发出了
 */
function handleLogoutResponse(response) {
  // 在 unload 场景下，主要关注请求是否成功发出
  // 即使有错误，页面也即将关闭，难以有效处理
  if (response?.status === 200) {
    // 可以根据需要检查 response.data，但通常 unload 时不处理
    // console.log("Logout request sent successfully (response ignored in unload).");
    return true;
  } else {
    console.error("Logout request failed or did not complete:", response);
    return false;
  }
}

/**
 * 获取登录挑战码
 * @param {string} username 用户名
 * @param {string} deviceId 设备 ID
 * @returns {Promise<string>} 挑战码
 */
export async function getChallenge(username, deviceId) {
  try {
    const rpcRequest = {
      id: `challenge-${Date.now()}`,
      method: 'auth.getChallenge',
      params: {
        username,
        device_id: deviceId
      }
    };
    const response = await request.post('/v1/jsonrpc2', rpcRequest);
    const result = handleAuthResponse(response);

    if (!result || !result.challenge) {
        throw new Error('服务器返回的挑战码格式不正确');
    }
    return result.challenge;
  } catch (error) {
      console.error("获取挑战码失败:", error);
      throw error instanceof Error ? error : new Error('获取挑战码失败');
  }
}

/**
 * 执行登录操作
 * @param {Object} loginData 登录所需数据
 * @param {string} loginData.username 用户名
 * @param {string} loginData.challenge 挑战码
 * @param {string} loginData.credential 凭证
 * @param {string} loginData.deviceId 设备 ID
 * @param {Object} loginData.deviceInfo 设备信息
 * @param {boolean} loginData.remember_me 是否记住我
 * @returns {Promise<Object>} 登录结果 { access_token, refresh_token, expires_in, user }
 */
export async function login(loginData) {
    try {
        const rpcRequest = {
            id: `login-${Date.now()}`,
            method: 'auth.login',
            params: {
                username: loginData.username,
                challenge: loginData.challenge,
                credential: loginData.credential,
                device_id: loginData.deviceId,
                device_info: loginData.deviceInfo,
                remember_me: loginData.remember_me
            }
        };
        const response = await request.post('/v1/jsonrpc2', rpcRequest);
        const result = handleAuthResponse(response);
        // 可以在这里添加对登录结果的更严格校验
        if (!result || !result.access_token || !result.user) {
            throw new Error('登录响应数据格式不正确');
        }
        return result;
    } catch (error) {
        console.error("登录失败:", error);
        throw error instanceof Error ? error : new Error('登录失败');
    }
}

/**
 * 调用登出 API
 * @param {string} deviceId 设备 ID
 * @param {string} accessToken 访问令牌
 * @param {boolean} useKeepalive 是否使用 keepalive 选项 (用于 unload 事件)
 * @returns {Promise<boolean>} 请求是否成功发出
 */
export async function logout(deviceId, accessToken, useKeepalive = false) {
  try {
    const response = await request.post(
      "/v1/jsonrpc2",
      {
        id: `logout-${Date.now()}`,
        method: "auth.logout",
        params: {
          device_id: deviceId,
          logout_all: false, // 通常只登出当前设备
        },
      },
      {
        headers: {
          Authorization: `Bearer ${accessToken}`,
        },
        // 仅在 useKeepalive 为 true 时添加 keepalive 选项
        ...(useKeepalive && { keepalive: true }),
      }
    );
    // 对于 keepalive 请求，response 可能不可靠或为空
    // 主要依赖于 fetch 能否在页面卸载前发出请求
    if (useKeepalive) {
        // 假设请求已发出，不依赖响应
        return true;
    }
    // 对于非 keepalive 请求，使用 handleAuthResponse 检查错误
    // 注意：logout 成功时 result 可能为空或只包含简单确认信息，需调整 handleAuthResponse 或此处逻辑
    // 这里暂时用 handleLogoutResponse 保持原逻辑
    return handleLogoutResponse(response);
  } catch (error) {
    console.error("登出 API 调用失败:", error);
    // 在 keepalive 场景下，这里的 catch 可能不会被触发或无法阻止页面卸载
    // throw error instanceof Error ? error : new Error("登出失败");
    return false; // 表明请求发送失败或过程中出错
  }
}

// 未来可以添加 refreshToken 等函数 